package org.tinygroup.uiml;

import org.tinygroup.uiml.config.Component;
import org.tinygroup.uiml.config.Property;
import org.tinygroup.uiml.config.Style;
import org.tinygroup.uiml.config.Styles;
import org.tinygroup.uiml.metadata.ComponentType;
import org.tinygroup.uiml.metadata.PropertyType;
import org.tinygroup.uiml.metadata.StyleType;
import org.tinygroup.uiml.metadata.StylesType;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * UIML管理器
 * Created by luoguo on 2014/7/1.
 */
public interface UimlEngine {

    String SUPER_COMPONENT_TYPE="tinyUimlComponent";
    
    String STYLE_PROPERTY_KEY="style";
	
	String XSTREAM_PACKAGENAME="uiml";
    /**
     * 添加组件
     *
     * @param component
     */
    void addComponent(Component component);
    
    /**
     * 移除组件
     *
     * @param component
     */
    void removeComponent(Component component);

    /**
     * 获取组件
     *
     * @param id
     * @return
     */
    Component getComponent(String id);

    /**
     * 添加组件类型
     *
     * @param componentType
     */
    void addComponentType(ComponentType componentType);
    /**
     * 移除组件类型
     *
     * @param componentType
     */
    void removeComponentType(ComponentType componentType);

    /**
     * 获取组件类型
     *
     * @param type
     * @return
     */
    Map<String, ComponentType> getComponentTypeList(String type);

    /**
     * 获取指定平台指定类型的组件类型
     *
     * @param type
     * @param platform
     * @return
     */
    ComponentType getComponentType(String type, String platform);

    /**
     * 添加样式类型
     *
     * @param styles
     */
    void addStylesType(StylesType styles);
    
    /**
     * 移除样式类型
     *
     * @param styles
     */
    void removeStylesType(StylesType styles);


    /**
     * 获取样式类型
     *
     * @param name
     * @return
     */
    StyleType getStyleType(String platform, String name);
    
    /**
     * 添加样式
     *
     * @param style
     */
    void addStyle(Style style);
    
    /**
     * 移除样式
     *
     * @param style
     */
    void removeStyle(Style style);

    /**
     * 添加样式
     *
     * @param styles
     */
    void addStyle(Styles styles);
    
    /**
     * 移除样式
     *
     * @param styles
     */
    void removeStyle(Styles styles);
    /**
     * 获取样式
     *
     * @param name
     * @return
     */
    Style getStyle(String name);

    /**
     * 返回指定平台类型的组件列表，注意只能返回平台为空或与指定的平台相等的组件
     *
     * @return
     */
    Collection<Component> getComponentList();

    /**
     * 获取组件在指定平台的属性列表，注意只能返回平台为空或与指定的平台相等的属性
     *
     * @param component
     * @return
     */
    List<Property> getPropertyList(Component component, String platform);

    /**
     * 返回组件的样式属性列表，注意只能返回平台为空或与指定的平台相等的属性
     *
     * @param component
     * @return
     */
    List<Property> getStylePropertyList(Component component, String platform);
    
    /**
     * 获取某组件类型和某平台下，对应的属性类型列表
     * @param type
     * @param platform
     * @return
     */
    Map<String,List<PropertyType>> getPropertyTypeListWithPlatform(String type,String platform);
    /**
     * 获取某组件类型和某种分类下，对应的属性类型列表
     * @param type
     * @param category
     * @return
     */
    Map<String,List<PropertyType>> getPropertyTypeListWithCategory(String type,String category);
    
}
